import random

from django.http import HttpResponse
from rest_framework.response import Response
from rest_framework.views import APIView
# 自己读取参数 校验参数 APIView

from meiduo_mall.libs.captcha.captcha import captcha

from django_redis import get_redis_connection

from rest_framework.generics import GenericAPIView
# 使用序列化器 读取参数 校验参数
from celery_tasks.sms.tasks import send_sms_code
from . import constants, serializers


# Create your views here.
# from celery_tasks.sms.yuntongxun.sms import CCP


# 跨域
# 域 协议+IP（域名）+端口
# 前端 域 http://127.0.0.1:8080
# 后端 域 http://127.0.0.1:8000
# 说明
# js进行跨域请求 同源策略
# 浏览器会尝试向后端发送options请求 -> 向后端询问是否支持前端这个域名发起的请求
# 后端返回allow 就可以进行跨域请求
# 使用中间件 Middleware 在中间件处理js的跨域请求

# 步骤
# 1.安装pip install django-cors-headers
# 2.添加应用 设置
# INSTALLED_APPS = (
#     ...
#     'corsheaders',
#     ...
# )
# 3.中间设置
# MIDDLEWARE = [
#     'corsheaders.middleware.CorsMiddleware',
#     ...
# ]
# 4.添加白名单
# 凡是出现白名单中的域名 都可以访问后端接口
# CORS
# CORS_ORIGIN_WHITELIST = (
#     '127.0.0.1:8080',
#     'localhost:8080',
#     'www.meiduo.site:8080',
#     'api.meiduo.site:8000'
# )
# 指明在跨域访问中，后端是否支持对cookie的操作。
# CORS_ALLOW_CREDENTIALS = True  # 允许携带cookie

# 设置域名
# 域名设计
#     前端 www.meiduo.site
#     后端 	api.meiduo.site
# 域名配置 sudo
# 127.0.0.1 www.meiduo.site
# 127.0.0.1 api.meiduo.site


# GET /sms_codes/(?P<mobile>1[3-9]\d{9})/?image_code_id=xxx&text=xxx
# url('^sms_codes/(?P<mobile>1[3-9]\d{9})/$', views.SMSCodeView.as_view()),
class SMSCodeView(GenericAPIView):
    """发送短信验证码"""
    # 指定序列化器
    # serializer_class = "校验图片验证码的序列化器"

    serializer_class = serializers.ImageCodeCheckSerializer

    def get(self, request, mobile):
        # 忽略校验,假设校验通过

        # 创建序列化对象data=request.query_params 是将url中的查询字符串传入到序列器中
        serializer = self.get_serializer(data=request.query_params)

        # 开辟校验
        serializer.is_valid(raise_exception=True)

        # 生成短信验证码 0
        sms_code = "%06d" % random.randint(0, 999999)
        print(sms_code)
        print(mobile)
        # 存储短信验证码到redis数据库
        redis_conn = get_redis_connection("verify_codes")
        # redis_conn.setex("sms_%s" % mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code)

        # redis_conn.get()
        # return

        # 记录用户发送短信的频度
        # redis_conn.setex("send_flag_$s" % mobile, constants.SEND_SMS_CODE_INTERVAL, 1)

        # 创建管道  优化性能 一起执行
        pl = redis_conn.pipeline()
        pl.setex("sms_%s" % mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code)
        pl.setex("send_flag_%s" % mobile, constants.SEND_SMS_CODE_INTERVAL, 1)

        # 开启执行
        pl.execute()

        # sr = StrictRedis()
        # pl = sr.pipeline()
        # pl.get()

        # 发送短信验证码 300//60=5  300/60=5.0
        # CCP().send_template_sms(mobile, [sms_code, constants.SMS_CODE_REDIS_EXPIRES // 60],
        #                         constants.SMS_SMS_TEMPLATE_ID)

        # "send_sms_code"
        # 调用异步任务 将异步任务发送到broker任务队列
        # 使用delay函数
        send_sms_code.delay(mobile, sms_code)
        # 响应结果
        return Response({"message": "OK"})


# celery 异步
# Django 定义和发布异步任务的
# def send_sms_code():
#     # 异步去发送短信任务
#     pass
# 任务发送到 send_sms_code 任务队列(broker)


class ImageCodeView(APIView):
    """
    提供图片验证码
    访问方式 GET
    路径 r"^image_codes/(?p<image_code_id[\w-]+>)/$"
    """

    def get(self, request, image_code_id):
        # 生成图片验证码 text是验证码内容 需要保存到Redis数据库中
        # image是图片验证码数据 需要响应给前端
        print("image_code_id", image_code_id)
        text, image = captcha.generate_captcha()
        print("text", text)
        # print("image",image)

        # 将图片验证码内容存储到redis数据库中
        # redis提供了get_redis_connectiong
        redis_conn = get_redis_connection("verify_codes")
        # redis_conn.setex("key","expires","value")
        redis_conn.setex("img_%s" % image_code_id, constants.SMS_CODE_REDIS_EXPIRES, text)

        # 将图片验证码图片响应到前端
        return HttpResponse(image, content_type="images/jpg")
